
"""
目标：
    爬取网易云音乐的评论
步骤：
    1、首先分析页面，查看源代码是什么数据，是静态数据还是动态数据？
    2、查看源代码
    3、发现 右键点击 有个网页源代码和 框架源代码？
        网易云音乐是html里面嵌套了一层html源代码
    4、发现在源代码里面找不到这个数据？那这属于js二次加载的数据  即动态数据
    5、查看接口请求内容
    6、
"""
# 需要安装模块   pip install pycrypto
from Crypto.Cipher import AES
from base64 import b64decode
import requests
import json

url = "https://music.163.com/weapi/comment/resource/comments/get?csrf_token="  # POST


# 分析js运行路径得到data原始数据
data = {
    "csrf_token": "",
    "cursor": "-1",
    "offset": "0",
    "orderType": "1",
    "pageNo": "1",
    "pageSize": "20",
    "rid": "R_SO_4_1847422867",
    "threadId": "R_SO_4_1847422867"
}

f = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7"
e = "010001"
g = "0CoJUm6Qyw8W8jud"
i = "Gk9iBseshLrBLLZP"

def get_encSecKey():
    return "3678e719650c928515baa69b7a4ae211d24c54b87385ad0c5580db032538ad8f9403576567438503a9750ee7b538c75fef3753b040ccc606849cdcc058a743a9fe5ade7be5a026fb57eb2bc76fc3370f275a5b30a08cd15870ba8b7501422c22c6a535045d48b609e2e6dc94a4afa4c4a443f46d30314bbacf706a9d10613d6f"


def get_paramas(data):
    first = enc_encText(data, g)
    res = enc_encText(first, i)

    return res  # 返回的就是params
def to_16(data):
    pad = 16 - len(data) % 16
    data += chr(pad) * pad
    return data

def enc_encText(data, key):  # 加密的过程
    iv = '0102030405060708'
    data = to_16(data)
    aes = AES.new(key=key.encode('utf-8'), IV=iv.encode('utf-8'), mode=AES.MODE_CBC)  # 创建一个加密的容器
    bs = aes.encrypt(data.encode('utf-8'))  # 进行加密， 要求加密的内容长度必须是16的倍数，
    """
    比如机密内容  '1234567890' 这是10个长度，那么长度需要补齐到16位，你差几位需要补几位
    每个位置必须为  chr(6)  差几个括号内填入几   差10个那么就填写 chr(10)
    如果正好是十六位，那么后面还需要加一个  chr(16), 必须满足16位的倍数

    """
    return str(b64decode(bs), 'utf-8')


"""
    function a(a) {   # a = 16    这个方法意思就是 循环十六次 取16个字符
        var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = "";
        for (d = 0; a > d; d += 1)
            e = Math.random() * b.length,   # 随机数  1.23
            e = Math.floor(e),   # 取整  1
            c += b.charAt(e);  # 通过b 的下标 取字符
        return c
    }
    function b(a, b) {
        var c = CryptoJS.enc.Utf8.parse(b)  # 
          , d = CryptoJS.enc.Utf8.parse("0102030405060708") # 加密的密钥
          , e = CryptoJS.enc.Utf8.parse(a)  # data数据
          , f = CryptoJS.AES.encrypt(e, c, {    
            iv: d,
            mode: CryptoJS.mode.CBC   # 模板： CBC
        });
        return f.toString()
    }
    function c(a, b, c) {
        var d, e;
        return setMaxDigits(131),
        d = new RSAKeyPair(b,"",c),
        e = encryptedString(d, a)
    }
    function d(d, e, f, g) {      # d：data数据,   e: 010001, f:很长的一串固定值, g: 0CoJUm6Qyw8W8jud
        var h = {}
          , i = a(16);  #取16个随机字符串
        return h.encText = b(d, g),
        h.encText = b(h.encText, i),
        h.encSecKey = c(i, e, f),  #思路： 把 i 这个参数更改为固定值，那么 key生成后也是固定值
        h
    }
    function e(a, b, d, e) {
        var f = {};
        return f.encText = c(a + e, b, d),
        f
    }

    window.asrsea = d,
"""


requests.post(url, data={
    'params' :get_paramas(json.dumps(data)),
    'encSeckey': get_encSecKey()
})



"""
报错收集：
1、ValueError:Input strings must be a multiple of 16 in length   字符串的长度必须是16的倍数
2、TypeError：a bytes-like object is required, not 'NoneType'   意思是这需要给字节类型的，把data encode一下
"""